


# 什么是架构： 软件 整体结构  与  组件  的  抽象描述， 用于指导 大型软件系统各个方面的设计
# 理解： 对软件和组件有深层次的理解， 对系统各个模块 组件 有一个好的理解，能抽象提炼出一张软件架构图
# 指导开发 和 系统负责人  在系统设计上遵循一个统一的指导思想， 
# 一个好的架构至少在两年时间内都有一个好的表现， 不需要再技术上做重构和优化

# 业务架构
# 系统架构


# 明确 需求  ---------  系统能力分解  ----------- 技术选型  ---------  架构说明书
# 中级 ---- 编写代码和框架
# 高级 ---- 技术攻关，性能优化    --------------------我的目标-------------------------
# 系统架构 ---- 解决所有业务和技术问题




# 传统服务缺点：
#         服务间耦合度高，隔离型弱，互相影响
#         部署臃肿，开发维护困难


# 微服务：
#         高内聚低耦合，隔离性强，不会互相影响
#         单独部署，独立开发，维护相对容易

        # 需要解决的问题：
        #         服务治理（调用通信，健康管理，限流熔断）
                                # 1. 提供对外服务注册接口   --------------  通过 zookeeper 这种注册发现机制实现的
                                # 2. 通过负载均衡选在服务提供者
                                # 3. 动态扩缩容（生产、消费）
                                # 4. 监控，限流，降级，高容错
                                # 5. 定制化开发
        #         数据一致性
        #         调用性能
        #         研发流程，部署调试


# 架构设计分层实现

#         分层模型设计思想


# 为什么分层：
#         1. 分而治之
#         2. 各司其职
#         3. 有条不紊的结合



# 技术演进
#     1. mvc
#         web层
#         业务
#         数据访问
#         数据持久









# 访问层架构知识


        # web接入层负载均衡，前置缓存等设计技术


        # lvs 基于 ip 层的负载均衡技术，基于内容请求分发技术 --- 整个服务集群的结构对客户是透明的


        # nginx：
        #         效处理静态文件，通过 sendfile 机制减少内存拷贝，支持 expires 头设置缓存策略，显著提升加载速度
        #         多站点托管：单服务器托管多个域名或站点，通过不同 server_name 区分请求
        #         反向代理：隐藏后端服务器，接收客户端请求并转发至应用服务器（如 Tomcat、Node.js），返回响应给客户端
        #         负载均衡：支持多种算法分发请求至后端集群，提升系统可用性
        #         处理 HTTPS 加密连接，解密后转发明文请求至后端，降低后端计算开销
        #         访问限制：ip过滤
        #         缓存后端响应，减少重复请求
        #         文件压缩、通过keepalive_timeout 维持长连接，减少tcp五握手开销
                

# API网关层架构知识

        # 分布式会话管理：将 token 存到 redis，这样既可以扩展，也保证一致性
        # API网关：身份验证，流量控制，路由服务，记录调试，统计信息


        # 重接入：
        #         网关层 多次过去api， 将结果集合汇总，返回给前端调用
        #                 ---- 过度聚合导致服务不便于管理

        # 轻接入：
        #         组件层提供service服务，提供打包后的api
                        # ---- service聚合服务不够灵活


# 核心服务层架构知识


        # Dubbo服务治理、异步MQ、任务调度、缓存、隔离队列等核心服务层
                # 同步通信
                # 异步通信

        

        # 缓存推荐到距离用户最近的地方  --------  多级缓存
                # CDN 静态资源缓存
                #   接入层缓存： nginx 动态缓存
                #   nginx 应用层 lua  和 nginx lua redis
                #   应用层 redis 服务器
                #   db

                                        # --------- nginx 上的 redis  和  应用层 redis 可以做主从复制

        # 硬件隔离(虚拟机)
        # 操作系统隔离(容器虚拟化)
        # 进程隔离(系统拆分)
        # 线程隔离(线程池独立)
        # 读写隔离(读写分离)
        # 动静隔离(动态资源静态资源分离)
        # 热点隔离(热点账户，热点数据等)


        # 流量开关：
        #         消费者  ---  投放需求到 消息队列 ---  使用超时自旋锁 --- 定期到 redis 查询指定的 key 的状态
        #         消息队列 --- 将 rpc 发送给 生产者 --- 生产者处理完 --- 通知消息队列 --- 消息队列更新redis 
        #         这期间 消息队列可以做 流量开关，排队处理，流量大小控制

                     


# 数据存储及接入层知识

        # redis、sql数据库、NoSQL数据库，代理接入，分库分表

        # 非结构化数据  --  网络磁盘文件（阿里云oss）  
        # 结构化 -- 关系型数据：mysql --  非关系型 --- 不需要落盘使用内存数据库  ---  落盘用非关系型数据库（mongodb 和 hbase）
        # 半结构化数据 --- 用xml 或 json 来描述 --- 再考虑用什么存储




# 监控，限流，降级知识

        # 服务监控、应急限流，降级

        # 监控： 硬件指标；软件指标； 接口指标； 异常指标； 大盘指标

        # 限流：  ----尽量用单机限流，不用集群限流 ---  计数器，令牌等可以放到redis中
        #       限制并发数 定义接口计数器，为0了返回限流异常； 
        #       令牌桶算法 定义一个桶，放入n个令牌，每来一个取走一个令牌； 每隔一定的时间重置令牌数
        #       漏桶算法 ： 
        #               流入水到桶（如果桶满了，每次流入1个，消费一个， 如果桶空了可以一次加满，也就是应对突发流量 ）  
        #               ---   每次消费n个（流入也是n）

        # 降级： 关闭接口； 设置默认返回